package backing;

import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import to.Cidade;
import to.Estado;
import to.Funcionario;
import to.PessoaAtendimento;
import to.Protocolo_Telefonico;
import to.Usuario;
import dao.AbstractDAO;
import dao.AtendimentoDAO;
import dao.CidadeDAO;
import dao.UsuarioDAO;

@ManagedBean
@SessionScoped
public class AtendFoneBacking {

	private List<Estado> listaEstado;
	private List<Cidade> listaCidade;
	private Integer cidadeSelecionada;
	private Integer estadoSelecionado;
	private Integer codPessoaSelecionada;
	private Funcionario funcionarioLogado;
	private HttpSession session = null;
	private Usuario usuario;
	private String codProtocolo;
	private String nomeInformado;
	private PessoaAtendimento pessoaSelecionada;
	private Protocolo_Telefonico protocoloSelecionado;
	private Integer CodprotocoloInformado;
	private Protocolo_Telefonico protocoloInformado;
	private List<PessoaAtendimento> listaPessoa;
	private List<PessoaAtendimento> listaPessoaPorNome;
	private List<Protocolo_Telefonico> listaProtocolo;

	CidadeDAO cDAO = new CidadeDAO();
	AbstractDAO abDAO = new AbstractDAO();
	UsuarioDAO userDAO = new UsuarioDAO();
	AtendimentoDAO atendDAO = new AtendimentoDAO();

	Protocolo_Telefonico protSalvar = new Protocolo_Telefonico();
	PessoaAtendimento pessoaSalvar = new PessoaAtendimento();

	public AtendFoneBacking() {

		criarListaEstado();
		pesquisaPessoa();

	}

	public void finalizarAtendimento() {

		try {

			ExternalContext externalContext = FacesContext.getCurrentInstance()
					.getExternalContext();
			session = (HttpSession) externalContext.getSession(false);
			usuario = (Usuario) session.getAttribute("currentUser");

			pessoaSalvar.setCidade(cDAO
					.buscarCidadePorCodigo(cidadeSelecionada));
			abDAO.saveOrUpdate(pessoaSalvar);

			funcionarioLogado = userDAO.pesquisarFuncionario(usuario);
			protSalvar.setAtendente(funcionarioLogado);
			protSalvar.setDataAtendimento(new Date());
			protSalvar.setPessoaAtendida(pessoaSalvar);
			abDAO.saveOrUpdate(protSalvar);

			System.out.println("Cidade:" + cidadeSelecionada);

			GregorianCalendar c = new GregorianCalendar();
			c.setTime(protSalvar.getDataAtendimento());
			System.out.println("Ano: " + c.get(GregorianCalendar.YEAR));
			int mes = c.get(GregorianCalendar.MONTH) + 1;
			System.out.println("Mes: " + mes);
			StringBuilder protocolo = new StringBuilder();
			protocolo.append(c.get(GregorianCalendar.YEAR)).append(mes)
					.append(protSalvar.getId());
			protSalvar.setCodProtocolo(Integer.parseInt(protocolo.toString()));
			abDAO.saveOrUpdate(protSalvar);

			codProtocolo = protSalvar.getCodProtocolo().toString();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String iniciaAtendPessoaSelecionada() {

		cidadeSelecionada = pessoaSelecionada.getCidade().getId();
		estadoSelecionado = pessoaSelecionada.getCidade().getEstado().getId();
		this.criaListaCidade();
		return "../atendimento/protocol_Atend_Fone.jsf";
	}

	public String iniciaNovoAtendimento() {

		cidadeSelecionada = null;
		pessoaSalvar = new PessoaAtendimento();
		protSalvar = new Protocolo_Telefonico();
		return "../atendimento/protocol_Atend_Fone.jsf";
	}

	public String telaPesquisaAtendimento() {

		pessoaSelecionada = null;
		listaProtocolo = null;
		return "../atendimento/pesquisaAtendimento.jsf";
	}

	public void pesquisaAtendPorProtocolo() {

		protocoloInformado = atendDAO
				.buscaProtocoloPorCodigo(CodprotocoloInformado);
	}

	public void pesquisaPessoa() {

		this.listaPessoa = new ArrayList<PessoaAtendimento>(
				atendDAO.buscarTodasPessoas());
	}

	public void buscaPessoaPorNome() {

		this.listaPessoaPorNome = new ArrayList<PessoaAtendimento>(
				atendDAO.buscarPessoaPorNome(nomeInformado));
	}

	public void criarListaEstado() {

		this.listaEstado = new ArrayList<Estado>(cDAO.buscarTodosEstados());
	}

	public void criaListaCidade() {

		this.listaCidade = new ArrayList<Cidade>(
				cDAO.buscarCidadePorEstado(estadoSelecionado));
	}

	public void criarListaProtocolo(PessoaAtendimento p) {

		this.listaProtocolo = new ArrayList<Protocolo_Telefonico>(
				atendDAO.buscarProtocoloPorPessoa(p));
	}

	public void selecionaPessoa(PessoaAtendimento p) {

		pessoaSelecionada = p;
		codPessoaSelecionada = pessoaSelecionada.getId();
		nomeInformado = pessoaSelecionada.getNome();
		pessoaSalvar = pessoaSelecionada;
		criarListaProtocolo(p);

	}

	public void selecionaProtocolo(Protocolo_Telefonico prot) {

		protocoloSelecionado = prot;

	}

	public List<Estado> getListaEstado() {
		return listaEstado;
	}

	public void setListaEstado(List<Estado> listaEstado) {
		this.listaEstado = listaEstado;
	}

	public List<Cidade> getListaCidade() {
		return listaCidade;
	}

	public void setListaCidade(List<Cidade> listaCidade) {
		this.listaCidade = listaCidade;
	}

	public Integer getCidadeSelecionada() {
		return cidadeSelecionada;
	}

	public void setCidadeSelecionada(Integer cidadeSelecionada) {
		this.cidadeSelecionada = cidadeSelecionada;
	}

	public Integer getEstadoSelecionado() {
		return estadoSelecionado;
	}

	public void setEstadoSelecionado(Integer estadoSelecionado) {
		this.estadoSelecionado = estadoSelecionado;
	}

	public Funcionario getFuncionarioLogado() {
		return funcionarioLogado;
	}

	public void setFuncionarioLogado(Funcionario funcionarioLogado) {
		this.funcionarioLogado = funcionarioLogado;
	}

	public HttpSession getSession() {
		return session;
	}

	public void setSession(HttpSession session) {
		this.session = session;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Protocolo_Telefonico getProtSalvar() {
		return protSalvar;
	}

	public void setProtSalvar(Protocolo_Telefonico protSalvar) {
		this.protSalvar = protSalvar;
	}

	public String getCodProtocolo() {
		return codProtocolo;
	}

	public void setCodProtocolo(String codProtocolo) {
		this.codProtocolo = codProtocolo;
	}

	public PessoaAtendimento getPessoaSalvar() {
		return pessoaSalvar;
	}

	public void setPessoaSalvar(PessoaAtendimento pessoaSalvar) {
		this.pessoaSalvar = pessoaSalvar;
	}

	public List<PessoaAtendimento> getListaPessoa() {
		return listaPessoa;
	}

	public void setListaPessoa(List<PessoaAtendimento> listaPessoa) {
		this.listaPessoa = listaPessoa;
	}

	public List<PessoaAtendimento> getListaPessoaPorNome() {
		return listaPessoaPorNome;
	}

	public void setListaPessoaPorNome(List<PessoaAtendimento> listaPessoaPorNome) {
		this.listaPessoaPorNome = listaPessoaPorNome;
	}

	public String getNomeInformado() {
		return nomeInformado;
	}

	public void setNomeInformado(String nomeInformado) {
		this.nomeInformado = nomeInformado;
	}

	public List<Protocolo_Telefonico> getListaProtocolo() {
		return listaProtocolo;
	}

	public void setListaProtocolo(List<Protocolo_Telefonico> listaProtocolo) {
		this.listaProtocolo = listaProtocolo;
	}

	public PessoaAtendimento getPessoaSelecionada() {
		return pessoaSelecionada;
	}

	public void setPessoaSelecionada(PessoaAtendimento pessoaSelecionada) {
		this.pessoaSelecionada = pessoaSelecionada;
	}

	public Integer getCodPessoaSelecionada() {
		return codPessoaSelecionada;
	}

	public void setCodPessoaSelecionada(Integer codPessoaSelecionada) {
		this.codPessoaSelecionada = codPessoaSelecionada;
	}

	public Protocolo_Telefonico getProtocoloSelecionado() {
		return protocoloSelecionado;
	}

	public void setProtocoloSelecionado(
			Protocolo_Telefonico protocoloSelecionado) {
		this.protocoloSelecionado = protocoloSelecionado;
	}

	public Integer getCodprotocoloInformado() {
		return CodprotocoloInformado;
	}

	public void setCodprotocoloInformado(Integer codprotocoloInformado) {
		CodprotocoloInformado = codprotocoloInformado;
	}

	public Protocolo_Telefonico getProtocoloInformado() {
		return protocoloInformado;
	}

	public void setProtocoloInformado(Protocolo_Telefonico protocoloInformado) {
		this.protocoloInformado = protocoloInformado;
	}

}
